//! 由平台提供的一个实时计数器，通过内存映射的方式暴露出来（可读写），
//! mtime 必须按照常量频率递增，并且，平台必须提供一种决定 mtime 打点周期的机制。
//! mtime 在计数溢出时会回绕。
//!
//! ⚠️ CSR 寄存器 `time` 是内存映射寄存器 `mtime` 的一个只读映射。
//! RV32I 中 timeh CSR 寄存器时内存映射的 mtime 寄存器的高 32bit（只读），而 time 为低 32bit。
//! 本模块实际上读的是映射之后的 `time` 和 `timeh` 寄存器。如果平台具体实现不提供这种映射，则不应当使用本模块。
//!
//! 且 CSR 中的映射为只读映射，因此提供的功能有限。本模块后续可能会被删除。
//!
//! 另外，mtimecmp 不要求映射到 CSR 寄存器中，mtimecmp 作为内存映射寄存器，其地址由各平台自行定义，
//! 因此本 crate 不提供 mtimecmp 访问。
use bits::{BitsOps, IntoBits};

use crate::csrr;

pub fn read() -> u64 {
    if cfg!(target_arch = "riscv32") {
        let low: u32 = csrr!(time) as u32;
        let high: u32 = csrr!(timeh) as u32;
        0u64.bits(0..=31)
            .write(low as u64)
            .bits(32..)
            .write(high as u64)
    } else {
        csrr!(time) as u64
    }
}
